/**
 * @file    elog_utils.c
 * @brief   EasyLogger工具函数实现文件
 * @details 本文件实现了EasyLogger日志库的各种工具函数，包括：
 *          - 安全字符串操作函数（复制、按行复制等）
 *          - 内存操作函数（内存复制等）
 *          - 其他辅助工具函数
 */

#include <elog.h>
#include <string.h>

/* ---------------------------------------------- 字符串工具函数 -------------------------------------------- */

/**
 * @brief  安全字符串复制函数
 * @param  cur_len 当前已复制的日志长度，最大值为ELOG_LINE_BUF_SIZE
 * @param  dst 目标缓冲区指针
 * @param  src 源字符串指针
 * @return 实际复制的字符数量
 */
size_t elog_strcpy(size_t cur_len, char *dst, const char *src)
{
    const char *src_old = src;                                              /* 记录源字符串起始位置 */

    assert(dst);                                                            /* 断言目标指针有效 */
    assert(src);                                                            /* 断言源指针有效 */

    while (*src != 0)
    {
        /* 确保目标缓冲区有足够空间 */
        if (cur_len++ < ELOG_LINE_BUF_SIZE)
        {
            *dst++ = *src++;                                                /* 复制字符并移动指针 */
        }
        else
        {
            break;                                                          /* 缓冲区已满，停止复制 */
        }
    }
    return src - src_old;                                                   /* 返回复制的字符数 */
}

/**
 * @brief  按换行符分割复制日志行
 * @param  line 行日志缓冲区指针
 * @param  log 原始日志缓冲区指针
 * @param  len 原始日志缓冲区长度
 * @return 实际复制的字节数
 * @note   如果未找到换行符，将复制所有日志内容
 */
size_t elog_cpyln(char *line, const char *log, size_t len)
{
    size_t newline_len = strlen(ELOG_NEWLINE_SIGN), copy_size = 0;          /* 换行符长度和复制计数 */

    assert(line);                                                           /* 断言行缓冲区指针有效 */
    assert(log);                                                            /* 断言日志缓冲区指针有效 */

    while (len--)
    {
        *line++ = *log++;                                                   /* 复制字符并移动指针 */
        copy_size++;                                                        /* 增加复制计数 */
        if (copy_size >= newline_len && !strncmp(log - newline_len, ELOG_NEWLINE_SIGN, newline_len))
        {
            break;                                                          /* 找到换行符，停止复制 */
        }
    }
    return copy_size;                                                       /* 返回复制的字节数 */
}

/* ---------------------------------------------- 内存操作函数 --------------------------------------------- */
/**
 * @brief  内存复制函数
 * @param  dst 目标内存地址
 * @param  src 源内存地址
 * @param  count 复制的字节数
 * @return 目标内存地址指针
 * @note   此函数将源地址的内容复制到目标地址
 */
void *elog_memcpy(void *dst, const void *src, size_t count)
{
    char *tmp = (char *) dst, *s = (char *) src;                            /* 转换为字节指针 */

    assert(dst);                                                            /* 断言目标指针有效 */
    assert(src);                                                            /* 断言源指针有效 */

    while (count--)
    {
        *tmp++ = *s++;                                                      /* 逐字节复制 */
    }

    return dst;                                                             /* 返回目标地址 */
}
